package com.jingdianjichi.subject.infra.basic.utils;

import com.alibaba.druid.filter.config.ConfigTools;

import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;

/**
 * 使用Druid对数据的信息进行加密,我们的数据在配置文件中是明文存储的,非常的不安全
 */
public class DruidEncryptUtil {

    //公钥
    private static String publickey;

    //私钥
    private static String privateKey;

    //代码块,初始化内容
    static {
        try {
            //ConfigTools就是Druid用于加密的类
            //genKeyPair(int keySize) 函数的作用是生成一对公钥和私钥。在这里，参数 keySize 是密钥的大小，以位为单位。512 位是密钥大小，它指的是 RSA、DSA 等公钥算法中密钥的比特长度。
            String[] keyPair = ConfigTools.genKeyPair(512);

            privateKey=keyPair[0];
            System.out.println("privateKey:"+privateKey);

            publickey=keyPair[1];
            System.out.println("publickey:"+publickey);

        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        } catch (NoSuchProviderException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 加密方法,私钥加密
     *  /直接抛出异常,反正就是一个工具类来的
     */
    public static String encrypt(String plainText) throws Exception {
        String encrypt = ConfigTools.encrypt(privateKey, plainText);
        System.out.println("加密后是:"+encrypt);

        return encrypt;
    }


    /**
     * 解密方法,公钥解密
     */
    public static String decrypt(String encryptText) throws Exception {
        String decrypt = ConfigTools.decrypt(publickey, encryptText);
        System.out.println("解密后是:"+decrypt);

        return decrypt;
    }


    //加密我们在配置文件中写的明文密码
    public static void main(String[] args) throws Exception {
        String encrypt = encrypt("Wing1Q2W#E");

        System.out.println("encrypt:"+encrypt);

        String decrypt = decrypt(encrypt);

        System.out.println("解密后是:"+decrypt);

    }
}
